package br.com.fatecmc.persephone.core.dao.impl;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import br.com.fatecmc.core.dao.AbstractDAO;
import br.com.fatecmc.fatec.domain.Entidade;
import br.com.fatecmc.persephone.endereco.dao.impl.DAOEndereco;
import br.com.fatecmc.persephone.endereco.domain.Cidade;
import br.com.fatecmc.persephone.endereco.domain.Endereco;
import br.com.fatecmc.persephone.proprietario.domain.Proprietario;
import br.com.fatecmc.persephone.util.Telefone;
public class DAOProprietario extends AbstractDAO {

	public void salvarNomeProprietario(String nome){
		try{
			conexao.getConexao().createStatement(); 
	        String sql =  "INSERT INTO TB_PROPRIETARIOS (nome) VALUES(?)";
	        PreparedStatement pstm = conexao.getConexao().prepareStatement(sql);
	        pstm.setString(1, nome);
	        pstm.executeUpdate();
	        conexao.getConexao().close();
		}catch(SQLException ex) {
            Logger.getLogger(DAOProprietario.class.getName()).log(Level.SEVERE, null, ex);			
		}
		
	}
	
	@Override
	public void salvar(Entidade obj) throws IllegalArgumentException {
		 try {
	            Proprietario p = (Proprietario) obj;
	            conexao.getConexao().createStatement(); 
	            String sql =  "INSERT INTO TB_PROPRIETARIOS (nome, rg, rg_orgao_emissor, cpf, " +
	            		"end_rua, end_complemento, end_numero,end_bairro,end_id_cidade,end_cep, " +
	            		"telefone1_ddd, telefone1_numero, " +
	            		"telefone2_ddd, telefone2_numero, " +
	            		"telefone3_ddd, telefone3_numero) " +
	            " VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
	            PreparedStatement pstm = conexao.getConexao().prepareStatement(sql);
	            pstm.setString(1, p.getNome());
	            pstm.setString(2, p.getRg());
	            pstm.setString(3, p.getOrgaoEmissor());
	            pstm.setString(4, p.getCpf());
	            pstm.setString(5, p.getEndereco().getRua());
	            pstm.setString(6, p.getEndereco().getComplemento());
	            pstm.setString(7, p.getEndereco().getNumero());
	            pstm.setString(8, p.getEndereco().getBairro());
	            pstm.setInt(9, p.getEndereco().getCidade().getId());
	            pstm.setString(10, p.getEndereco().getCep());
	            int contador = 11;
	            for(Telefone tel : p.getTelefones()){
	            	pstm.setString(contador++,tel.getDdd());
	 	            pstm.setString(contador++, tel.getNumero());
	 	          
	            }
	            for(int i=contador;i<16;i++){
	            	pstm.setString(contador++, null);
		 	          
	            }
	            

	            pstm.executeUpdate();
	            conexao.getConexao().close();
	            pstm.close();
	        } catch (SQLException ex) {
	            Logger.getLogger(DAOProprietario.class.getName()).log(Level.SEVERE, null, ex);
	        }
		
	}

	@Override
	public Entidade alterar(Entidade obj) {
		 try {
	            Proprietario p = (Proprietario) obj;
	            conexao.getConexao().createStatement(); 
	            String sql =  "update tb_proprietarios set nome = ?, rg = ?, rg_orgao_emissor = ?, cpf = ?, " +
	            		"end_rua= ?, end_complemento= ?, end_numero= ?,end_bairro= ?,end_id_cidade = ?, end_cep = ?, " +
	            		"telefone1_ddd = ?, telefone1_numero= ?, " +
	            		"telefone2_ddd = ?, telefone2_numero= ?, " +
	            		"telefone3_ddd = ?, telefone3_numero= ? where id_proprietario = ? ";
	            PreparedStatement pstm = conexao.getConexao().prepareStatement(sql);
	            pstm.setString(1, p.getNome());
	            pstm.setString(2, p.getRg());
	            pstm.setString(3, p.getOrgaoEmissor());
	            pstm.setString(4, p.getCpf());
	            pstm.setString(5, p.getEndereco().getRua());
	            pstm.setString(6, p.getEndereco().getComplemento());
	            pstm.setString(7, p.getEndereco().getNumero());
	            pstm.setString(8, p.getEndereco().getBairro());
	            pstm.setInt(9, p.getEndereco().getCidade().getId());
	            pstm.setString(10, p.getEndereco().getCep());
	            int contador = 11;
	            for(Telefone tel : p.getTelefones()){
	            	pstm.setString(contador++,tel.getDdd());
	 	            pstm.setString(contador++, tel.getNumero());
	 	          
	            }
	            for(int i=contador;i<16;i++){
	            	pstm.setString(contador++, null);
		 	          
	            }
	            pstm.setInt(17, p.getId());

	            pstm.executeUpdate();
	            conexao.getConexao().close();
	            pstm.close();
	            return p;
	        } catch (SQLException ex) {
	            Logger.getLogger(DAOProprietario.class.getName()).log(Level.SEVERE, null, ex);
	            return null;
	        }
		
	}


	@Override
	public boolean excluir(Entidade obj) {
		 try {
	            Proprietario p = (Proprietario) obj;
	            conexao.getConexao().createStatement(); 
	            String sql =  "delete from tb_proprietarios where id_proprietario = ? ";
	            PreparedStatement pstm = conexao.getConexao().prepareStatement(sql);
	            pstm.setInt(1 , p.getId());
	            pstm.executeUpdate();
	            conexao.getConexao().close();
	            pstm.close();
	            return true;
	        } catch (SQLException ex) {
	            Logger.getLogger(DAOProprietario.class.getName()).log(Level.SEVERE, null, ex);
	            return false;
	        }
		
	}

	@Override
	public Collection<Entidade> consultar(Entidade obj) {
        try {
            Proprietario p = (Proprietario) obj;
            String sql ="";
            PreparedStatement pstm;
            conexao.getConexao().createStatement();
            if(p.getId() == null){
            	
            	if(p.getCpf()!= null || p.getRg() != null){
            		sql ="SELECT * from tb_proprietarios where cpf = ? or rg = ?"; 
                    pstm = conexao.getConexao().prepareStatement(sql);
                    pstm.setString(1, p.getCpf());
                    pstm.setString(2, p.getRg());
                    
            	}
            	else{
            		sql ="SELECT * from tb_proprietarios "; 
            		pstm = conexao.getConexao().prepareStatement(sql);
            	}
                
            }
            else{
            	sql = "SELECT * from tb_proprietarios where id_proprietario = ?";
            	pstm = conexao.getConexao().prepareStatement(sql);
            	pstm.setInt(1 , p.getId());
            }
            
            
            ResultSet rs = pstm.executeQuery();
            ArrayList<Entidade> lista = new ArrayList<Entidade>();
            while (rs.next()) {     
            	Proprietario pro = new Proprietario();
                pro.setId(rs.getInt("id_proprietario"));  
                pro.setNome(rs.getString("nome"));
                pro.setRg(rs.getString("rg"));
                pro.setCpf(rs.getString("cpf"));
                pro.setOrgaoEmissor(rs.getString("rg_orgao_emissor"));
                
                Endereco end = new Endereco();
                end.setRua(rs.getString("end_rua"));
                end.setComplemento(rs.getString("end_complemento"));
                end.setNumero(rs.getString("end_numero"));
                end.setBairro(rs.getString("end_bairro"));
                end.setCep(rs.getString("end_cep"));
                
                DAOEndereco dao = new DAOEndereco();
                Cidade cid = new Cidade();
                
                cid.setId(rs.getInt("end_id_cidade"));
                
                List<Entidade> cidades = (List<Entidade>) dao.consultar(cid);
                
                end.setCidade((Cidade) cidades.get(0));
                
                pro.setEndereco(end);
                
                Telefone tel1 = new Telefone();
                Telefone tel2 = new Telefone();
                Telefone tel3 = new Telefone();
                tel1.setDdd(rs.getString("telefone1_ddd"));
                tel1.setNumero(rs.getString("telefone1_numero"));
                
                tel2.setDdd(rs.getString("telefone2_ddd"));
                tel2.setNumero(rs.getString("telefone2_numero"));
                
                tel3.setDdd(rs.getString("telefone3_ddd"));
                tel3.setNumero(rs.getString("telefone3_numero"));
                
                ArrayList<Telefone> tels = new ArrayList<Telefone>();
                tels.add(tel1);
                tels.add(tel2);
                tels.add(tel3);
                
                pro.setTelefones(tels);
                
                lista.add(pro);
                
                
            }  
            conexao.getConexao().close();
            pstm.close();
            return lista;
        } catch (SQLException ex) {
            Logger.getLogger(DAOProprietario.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
	
	}
	
	public Proprietario consultarPorCPFouRG(Entidade obj) throws SQLException{
		Proprietario p = (Proprietario) obj;
        String sql ="";
        PreparedStatement pstm;
        conexao.getConexao().createStatement();
        sql ="SELECT * from tb_proprietarios where cpf = ? or rg = ?"; 
        pstm = conexao.getConexao().prepareStatement(sql);
        pstm.setString(1, p.getCpf());
        pstm.setString(2, p.getRg());
        
        ResultSet rs = pstm.executeQuery();
        Proprietario pro = new Proprietario();

        if(rs.next()){
        pro.setId(rs.getInt("id_proprietario"));  
        pro.setNome(rs.getString("nome"));
        pro.setRg(rs.getString("rg"));
        pro.setCpf(rs.getString("cpf"));
        pro.setOrgaoEmissor(rs.getString("rg_orgao_emissor"));
        
        Endereco end = new Endereco();
        end.setRua(rs.getString("end_rua"));
        end.setComplemento(rs.getString("end_complemento"));
        end.setNumero(rs.getString("end_numero"));
        end.setBairro(rs.getString("end_bairro"));
        end.setCep(rs.getString("end_cep"));
        
        DAOEndereco dao = new DAOEndereco();
        Cidade cid = new Cidade();
        
        cid.setId(rs.getInt("end_id_cidade"));
        
        List<Entidade> cidades = (List<Entidade>) dao.consultar(cid);
        
        end.setCidade((Cidade) cidades.get(0));
        
        pro.setEndereco(end);
        
        Telefone tel1 = new Telefone();
        Telefone tel2 = new Telefone();
        Telefone tel3 = new Telefone();
        tel1.setDdd(rs.getString("telefone1_ddd"));
        tel1.setNumero(rs.getString("telefone1_numero"));
        
        tel2.setDdd(rs.getString("telefone2_ddd"));
        tel2.setNumero(rs.getString("telefone2_numero"));
        
        tel3.setDdd(rs.getString("telefone3_ddd"));
        tel3.setNumero(rs.getString("telefone3_numero"));
        
        ArrayList<Telefone> tels = new ArrayList<Telefone>();
        tels.add(tel1);
        tels.add(tel2);
        tels.add(tel3);
        
        pro.setTelefones(tels);
        }
        else{
			System.out.println("nao existe brouw");
        }
        
        conexao.getConexao().close();
        pstm.close();
        
        return pro;
	}
}
